#include "udpServer.hpp"
#include <memory>
#include <cstdio>
#include <vector>

void Usage(std::string proc)
{
    std::cout<<"\n\rUsage: "<<proc<<" prot[1024+]\n"<<std::endl;     //输出提示信息建议绑定1024以上端口号
}

//用于服务端拼接字符串
std::string Handler(const std::string& str)           
{
    std::string res="Server get message";
    res+=str;
    std::cout<<res<<std::endl;
    return res;
}

//过滤关键字
bool SafeCheck(const std::string& cmd)
{
    int safe=false;
    std::vector<std::string> key_word={
        "rm",
        "mv",
        "cp",
        "kill",
        "unlik",
        "uninstall"
    };
    for(auto &word:key_word)
    {
        auto pos=cmd.find(word);
        if(pos!=std::string::npos)  return false;          //若相等则没找到，若不相等则找到了
    }
    return true;
}
std::string ExcuteCommand(const std::string& cmd)
{
    std::cout<<"get a request cmd: "<<cmd<<std::endl;
    if(!SafeCheck(cmd)) return "bad man";
    //执行命令
    FILE* fp=popen(cmd.c_str(),"r");
    if(fp==nullptr) 
    {
        perror("popen");
        return "error";
    }

    //打印出执行的命令
    std::string res;
    char buf[4096];
    while(true)
    {
        char* ok=fgets(buf,sizeof(buf),fp);
        if(ok==nullptr) break;
        res+=buf;
    }
    pclose(fp);
    return res;
}

//把端口号暴露给命令行，由命令行决定绑定哪一个端口号
int main(int argc,char *argv[])
{
    if(argc!=2)                             //命令行参数个数不等于2(可执行程序名和端口号)
    { 
        Usage(argv[0]);
        exit(0);
    }
    uint16_t port=std::stoi(argv[1]);       //字符串转整数

    std::unique_ptr<udpServer> svr(new udpServer(port));        
    svr->Init();
    svr->Run(Handler);
    return 0;
}